package com.springboot.dubbo.dubboapi.controller;

import com.springboot.dubbo.base.vo.ResultVO;
import com.springboot.dubbo.book.api.IBookProvider;
import com.springboot.dubbo.user.dto.UserInfoDTO;
import com.springboot.dubbo.user.dto.UserQueryDTO;
import com.springboot.dubbo.user.api.IUserProvider;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @ClassName BookController
 * @Description: 对外提供的RESTFul风格的API接口，也是消费端
 * @Author 杨冬冬
 * @Date 2021/6/29 0029 14:04
 **/
@RestController
public class BookController {

    /*
     * 多个应用程序可以使用一个注册中心
     * 可group来区分是某个组下的微服务成员
     **/
    @DubboReference(group = "dubbo-demo", version = "0.0.1")
    private IBookProvider bookProvider;

    /*
     * 版本号的作用
     * 比如微服务集群时，分批升级微服务，可分别升级其中的1台先进行业务测试
     * 版本号即是区分新旧
     **/
    @DubboReference(group = "dubbo-demo", version = "0.0.2")
    private IUserProvider userProvider;

    /*
     * @Author 杨冬冬
     * @Description 对外公网提供的API接口，也是按照微服务分割的方式来建不同的API接口
     *              如：BookController 、 UserController
     *              这里就没有细分
     * @Date 22:56 2021/7/3 0003
     * @param
     **/
    @RequestMapping("/book")
    public ResultVO hello() {
        String hello = bookProvider.list();
        System.out.println(hello);
        return new ResultVO.Builder().code(200).data(hello).build();
    }

    @RequestMapping("/user")
    public ResultVO user() {
        UserInfoDTO us = userProvider.getUser();
        return ResultVO.builder().code(200).data(us).build();
    }

    @RequestMapping("/user/book")
    public ResultVO ubook() {
        String data = bookProvider.userBook();
        return new ResultVO.Builder().data(data).build();
    }

    @RequestMapping("/user/list")
    public ResultVO ulist() {
        UserQueryDTO query = new UserQueryDTO();
        List<UserInfoDTO> data = userProvider.queryList(query);
        return new ResultVO.Builder().data(data).build();
    }

    /*
     * @Author 杨冬冬
     * @Description 这个接口是测试分布式事务的，在book的微服务中也调用user微服务，此时的book即是服务提供者也是消费者
     * @Date 22:58 2021/7/3 0003
     * @param null
     **/
    @RequestMapping("/seata")
    public ResultVO seata() {
        try {
            bookProvider.insert();
            return ResultVO.builder().data("成功").build();
        } catch (Exception ex) {
            return new ResultVO.Builder().data("失败").build();
        }
    }
}
